#!/usr/local/bin/lua

--字符串转数值 tonumber(字符串,进制数)默认是十进制
print(tonumber("10"))
print(tonumber("1010",2))

--数值转字符串 tostring()
tostring(10)
print(type(tostring(10)))
print(tostring(10) == "10")

-- string.len(s):返回字符串s的长度
-- string.rep(s, n):将字符串s重复n此的结果。例如,可以通过调用string.rep("a", 2^20)来创建一个1MB大小的字符串(例如用于测试)
-- string.reverse(s):返回一份s的副本(s本身不变),其中将s进行反转
-- string.lower(s):返回一份s的副本(s本身不变),其中所有的大写字母都变为小写字母
-- string.upper(s):返回一份s的副本(s本身不变),其中所有的小写字母都变为大写字母

print(string.len("Hello World"))
print(string.rep("abc", 3))
print(string.reverse("A Long Line!"))
print(string.lower("A Long Line!"))
print(string.upper("A Long Line!"))
-- lower()和upper()函数可以用来在忽略大小写的差异的原则下比较两个字符串
a = "Hello"
b = "World"
print(string.lower(a) < string.lower(b))

-- stirng.sub()
-- string.sub(s, i, j):从字符串s中提取第i个到第j个字符(包括i和j),字符串的索引从1开始
s ="HelloWorld"
print(string.sub(s, 1, 1))
print(string.sub(s, 1, 3))
-- 该函数还支持负数索引:
-- 负数索引从字符串的结尾开始计数(从-1开始)
-- -1代表最后一个字符,-2代表倒数第二个字符,以此类推
s = "HelloWorld"
 
-- 得到字符串s从开头开始长度为5的前缀
print(string.sub(s, 1, 5))
-- 得到字符串s从第6个字符开始的后缀
print(string.sub(s, 6, -1))
-- 去掉字符串s的第一个字符和最后一个字符
print(string.sub(s, 2, -2))

-- string.char() string.byte()
-- string.char():接收0个或多个整数作为参数,然后将每个整数转换为对应的字符,最后返回这些字符连接而成
print(string.char())
print(string.char(65))
print(string.char(66))
print(string.char(67))
print(string.char(65, 66, 67))
-- string.byte(s, i):返回字符串s中第i个字符的数值表示 string.byte()也支持负数索引
print(string.byte("ABC", 1))
print(string.byte("ABC", 2))
print(string.byte("ABC", 3))
print(string.byte("ABC", -1))
print(string.byte("ABC", -2))
print(string.byte("ABC", -3))

-- string.byte(s, i ,j):返回索引i到j之间(包括i和j)的所有字符的数值表示
-- 返回AB的数值表示
print(string.byte("ABCDEF", 1, 2))
 
-- 返回所有字符的数值表示
print(string.byte("ABCDEF", 1, -1))

-- string.byte(s, i ,j)的使用技巧:
-- 一种常见的写法是利用{string.byte(s , 1, -1)}创建一个由字符串s中的字符组成的表
-- 由于Lua语言限制了栈大小,所以也限制了一个函数的返回值的最大个数,默认最大为一百万个。因此,这个技巧不能用于大小超过1MB的字符串
print({string.byte("ABCDEF", 1, 2)})

-- string.format()
-- 该函数类似于C语言的print()函数,用来进行格式化的输出

x = 10
print(string.format("x = %d, y = %d", x, 20))
-- 将x使用十六进制打印
print(string.format("x = %x", x))
-- 在前面加上修饰符
print(string.format("x = 0x%x", x))
-- 将x以浮点数的格式打印
print(string.format("x = %d", x))
-- 打印字符串
tag, title = "hi", "a tile"
print(string.format("<%s>%s</%s>", tag, title, tag))

-- string.find():
-- 用于在指定的字符串中进行模式搜索
-- 返回值:如果找到了返回模式的开始和结束位置,否则返回nil

print(string.find("Hello World", "W"))
print(string.find("Hello World", "Wor"))
print(string.find("Hello World", "wor"))
print(string.find("Hello World", "war"))

-- string.gsub():
-- 把所有匹配的模式用另一个字符串替换
-- 返回值:返回替换之后的字符串,并且返回替换的字符个数

print(string.gsub("Hello World", "l", "."))
print(string.gsub("Hello World", "ll", ".."))
print(string.gsub("Hello World", "a", "."))

-- 可以使用冒号操作符像调用字符串的一个方法那样调用字符串标准库的所有函数
s = "HelloWorld"
print(string.len(s))
-- 使用冒号操作符调用
print(s:len())
print(string.sub(s, 1, 2))
-- 使用冒号操作符调用
print(s:sub(1,2))